package br.com.velp.sudecap.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import sun.misc.BASE64Encoder;

/**
 * <sumario>
 * <objetivo> "Rastreabilidade" </objetivo>
 * <autor> EDUARDO SANTOS DE OLIVEIRA </autor>
 * <versao>1.0.0.0</versao>
 * <data_criacao> 17.10.2012 </data_criacao>
 * <data_ultima_alteracao> N/A </data_ultima_alteracao>
 * 
 * <descricao> Classe utilitária para geração 
 *             de Strings Criptografadas, possibilitando
 *             a utilização dos seguintes algoritmos de 
 *             encriptação:  
 *             > MD2
 *             > MD5
 *             > SHA
 *             > SHA-1
 *             > SHA-256
 *             > SHA-384
 *             > SHA-512
 * </descricao>
 * 
 * </sumario>
 */
public abstract class CriptografiaUtil {

    private static MessageDigest messageDigest;
    private static BASE64Encoder encoder;

    public enum ALGORITMO {

        MD2("MD2"),
        MD5("MD5"),
        SHA("SHA"),
        SHA1("SHA-1"),
        SHA256("SHA-256"),
        SHA384("SHA-384"),
        SHA512("SHA-512");
        
        private String value;

        private ALGORITMO(String value) {
            this.value = value;
        }

        public String getValue() {
            return this.value;
        }
        
    }

    public static String criptografar(ALGORITMO algoritmo, String value){

        try {
            
            if (value == null) {
                throw new IllegalArgumentException("O Valor Informado é NULO");
            }

            utilizarAlgoritmo(algoritmo.getValue());

            byte[] hash = messageDigest.digest(value.getBytes());

            return encoder.encode(hash);
            
        } catch (Exception e) {

            e.printStackTrace();
            return null;
            
        }

    }

    private static void utilizarAlgoritmo(String algoritmo) throws NoSuchAlgorithmException {

        if (messageDigest == null || !messageDigest.getAlgorithm().equals(algoritmo)) {
            messageDigest = MessageDigest.getInstance(algoritmo);
        }

        if (encoder == null) {
            encoder = new BASE64Encoder();
        }

    }
    
}
